package com.jy.datapipeline.importserver.controller;

import com.alibaba.fastjson.JSONObject;
import com.jy.datapipeline.importserver.common.dto.ClientDto;
import com.jy.datapipeline.common.exception.GlobalException;
import com.jy.datapipeline.common.vo.ReturnVo;
import com.jy.datapipeline.importserver.service.ImportServerService;
import com.jy.datapipeline.importserver.support.MessageSupport;
import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @类名 ServerController
 * @描述 TODO
 * @作者 白条君
 * @创建日期 2023/5/7 22:35
 * @版本 1.0
 */
@Slf4j
@RestController
@RequestMapping("/server")
public class ImportServerController {

    @Resource
    private ImportServerService importServerService;

    @Resource
    private MessageSupport messageSupport;

    @PostMapping("/handle")
    public ReturnVo disposalClient(@RequestBody String message) throws GlobalException, SchedulerException {
        ClientDto clientDto = JSONObject.parseObject(message, ClientDto.class);
        String flag = clientDto.getFlag();
        ReturnVo returnVo = null;
        if ("get".equals(flag)) {
            //线程安全，根据是否执行状态获取未执行的任务
            returnVo = messageSupport.sendNotStartSubtasks();
        } else if ("retry".equals(flag)) {
            //线程安全，根据重试次数，获取数据文件校验失败的子任务
            returnVo = importServerService.retry(clientDto);
        } else if ("get-retry-subtask".equals(flag)) {
            //添加同步锁，根据执行状态，获取校验文件失败的重试子任务
            returnVo = importServerService.getRetrySubtask();
        } else if ("success".equals(flag) || "fail".equals(flag)) {
            //客户端发送sqlldr以后，根据客户端的请求生成导入成功或失败的日志
            importServerService.importSubtaskToSqlldr(clientDto);
        } else if ("get-ver-fail".equals(flag)) {
            //添加同步锁，根据执行次数为条件生成校验失败的子任务
            importServerService.generateVerFailRetrySubtask(clientDto);
        } else if ("finish".equals(flag)) {
            //添加同步锁，更新单次子任务执行的最后状态，根据次数进行更新
            importServerService.finish(clientDto);
        }
        return returnVo;
    }
}
